package com.evil.application.service;

import com.baomidou.mybatisplus.extension.service.IService;
import com.evil.application.pojo.entity.ApplicationPermission;
import com.evil.common.account.dto.user.UserBaseRespDTO;
import com.evil.common.application.dto.permission.app.*;
import com.evil.common.application.enums.ApplicationSourceTypeEnum;

import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Set;

/**
 * 应用权限表
 *
 * @author liyang
 * @date 2022-08-08 00:00
 */
public interface ApplicationPermissionService extends IService<ApplicationPermission> {

    /**
     * 应用权限
     *
     * @param sourceDTO sourceDTO
     * @return List
     */
    List<ApplicationPermission> findBySource(AppPermissionSourceDTO sourceDTO);

    /**
     * 应用权限
     *
     * @param appPermissionsReqDTO appPermissionsReqDTO
     * @return List
     */
    List<ApplicationPermission> findByAppPermissions(AppPermissionsReqDTO appPermissionsReqDTO);

    /**
     * 获取应用权限
     *
     * @param source source
     * @return AppPermissionDTO 列表
     */
    List<AppPermissionDTO> findDTOBySource(AppPermissionSourceDTO source);

    /**
     * 应用权限
     *
     * @param sourceTypeEnum sourceTypeEnum
     * @param sourceIds      sourceIds
     * @return Map（源id, 权限列表）
     */
    Map<Long, List<AppPermissionDTO>> findAppPermissionsBySource(ApplicationSourceTypeEnum sourceTypeEnum, Collection<Long> sourceIds);

    /**
     * 应用权限
     *
     * @param appPermissionsReqDTO appPermissionsReqDTO
     * @return Map（源id, 权限列表）
     */
    Map<Long, List<AppPermissionDTO>> findAppPermissionsBySource(AppPermissionsReqDTO appPermissionsReqDTO);

    /**
     * 获取应用权限
     *
     * @param sources sources
     * @return AppPermissionDTO 列表
     */
    Map<AppPermissionSourceDTO, List<AppPermissionDTO>> findDTOMapBySources(Collection<AppPermissionSourceDTO> sources);

    /**
     * 应用权限
     *
     * @param appPermissionsReqDTO appPermissionsReqDTO
     * @return Map（源id, 权限列表）
     */
    Map<Long, List<AppPermissionDTO>> findDTOByAppPermissions(AppPermissionsReqDTO appPermissionsReqDTO);

    /**
     * 获取应用权限的用户列表 角色/部门/动态 会转换成对应用户
     *
     * @param appPermissionSourceDTO appPermissionSourceDTO
     * @param isUse                  是否使用（过滤权限可见状态）
     * @return List
     */
    List<Long> getPermissionUserIdsBySource(AppPermissionSourceDTO appPermissionSourceDTO, Boolean isUse);

    /**
     * 获取应用权限的用户列表 角色/部门/动态 会转换成对应用户
     *
     * @param appPermissionSourceDTO appPermissionSourceDTO
     * @param isUse                  是否使用（过滤权限可见状态）
     * @return List
     */
    List<UserBaseRespDTO> getPermissionUsersBySource(AppPermissionSourceDTO appPermissionSourceDTO, Boolean isUse);

    /**
     * 获取应用权限的用户列表 角色/部门/动态 会转换成对应用户
     *
     * @param dynamic                dynamic
     * @param applicationPermissions applicationPermissions
     * @param isUse                  是否使用（过滤权限可见状态）
     * @return List
     */
    List<UserBaseRespDTO> getPermissionUsersByPermission(Object dynamic, Collection<ApplicationPermission> applicationPermissions, Boolean isUse);

    /**
     * 获取应用权限的用户列表 角色/部门/动态 会转换成对应用户
     *
     * @param dynamic        dynamic
     * @param appPermissions appPermissions
     * @param isUse          是否使用（过滤权限可见状态）
     * @return List
     */
    List<Long> getPermissionUserIdsByAppPermissionDTO(Object dynamic, Collection<AppPermissionDTO> appPermissions, Boolean isUse);

    /**
     * 获取应用权限的用户列表 角色/部门/动态 会转换成对应用户
     *
     * @param dynamic        dynamic
     * @param appPermissions appPermissions
     * @param isUse          是否使用（过滤权限可见状态）
     * @return List
     */
    List<UserBaseRespDTO> getPermissionUsersByAppPermissionDTO(Object dynamic, Collection<AppPermissionDTO> appPermissions, Boolean isUse);

    /**
     * 检查登录用户是否有权限
     *
     * @param enterpriseId           enterpriseId
     * @param permissionStatus       permissionStatus
     * @param appPermissionSourceDTO appPermissionSourceDTO
     * @param isUse                  是否使用（过滤权限可见状态）
     */
    void loginUserHasPermission_Check(Long enterpriseId, Integer permissionStatus, AppPermissionSourceDTO appPermissionSourceDTO, Boolean isUse);

    /**
     * 检查配置应用权限
     *
     * @param appPermissions appPermissions
     * @return List
     */
    boolean checkPermission(Collection<AppPermissionDTO> appPermissions);

    /**
     * 检查登录用户是否有权限
     *
     * @param appPermissionSourceDTO appPermissionSourceDTO
     * @param isUse                  是否使用（过滤权限可见状态）
     * @return boolean
     */
    boolean loginUserHasPermission(AppPermissionSourceDTO appPermissionSourceDTO, Boolean isUse);

    /**
     * 检查登录用户是否有权限
     *
     * @param dynamic        dynamic
     * @param appPermissions appPermissions
     * @param isUse          是否使用（过滤权限可见状态）
     * @return boolean
     */
    boolean loginUserHasPermission(Object dynamic, Collection<AppPermissionDTO> appPermissions, Boolean isUse);

    /**
     * 检查登录用户是否有权限
     *
     * @param enterpriseId           enterpriseId
     * @param permissionStatus       permissionStatus
     * @param appPermissionSourceDTO appPermissionSourceDTO
     * @param isUse                  是否使用（过滤权限可见状态）
     * @return boolean
     */
    boolean loginUserHasPermission(Long enterpriseId, Integer permissionStatus, AppPermissionSourceDTO appPermissionSourceDTO, Boolean isUse);

    /**
     * 检查登录用户是否有权限
     *
     * @param enterpriseId     enterpriseId
     * @param permissionStatus permissionStatus
     * @param dynamic          dynamic
     * @param appPermissions   appPermissions
     * @param isUse            是否使用（过滤权限可见状态）
     * @return boolean
     */
    boolean loginUserHasPermission(Long enterpriseId, Integer permissionStatus, Object dynamic, Collection<AppPermissionDTO> appPermissions, Boolean isUse);

    /**
     * 修改应用权限
     *
     * @param modifyAppPermissionReqDTO modifyAppPermissionReqDTO
     */
    void modifyPermission(ModifyAppPermissionReqDTO modifyAppPermissionReqDTO);

    /**
     * 复制应用权限
     *
     * @param copyAppPermissionReqDTO copyAppPermissionReqDTO
     * @return List
     */
    List<ApplicationPermission> copyPermission(CopyAppPermissionReqDTO copyAppPermissionReqDTO);

    /**
     * 删除权限
     *
     * @param sourceDTO sourceDTO
     */
    void deleteBySource(AppPermissionSourceDTO sourceDTO);

    /**
     * 处理app权限
     *
     * @param permissions permissions
     * @return Map 一层键permissionType，二层键sourceType，二层值targetId
     */
    Map<Integer, Map<Integer, Set<Long>>> convertAppPermission(List<AppPermissionDTO> permissions);

    /**
     * 转换目标权限类型
     *
     * @param typeTargetIdMap typeTargetIdMap，一层键permissionType，二层键sourceType，二层值targetId
     * @return Map 一层键permissionType，二层键targetId，二层值target
     */
    Map<Integer, Map<Long, ?>> convertTypeTarget(Map<Integer, Map<Integer, Set<Long>>> typeTargetIdMap);

    /**
     * 转DTO
     *
     * @param permissions permissions
     * @return AppPermissionDTO 列表
     */
    List<AppPermissionDTO> permissionsToDTO(Collection<ApplicationPermission> permissions);

    /**
     * 校验权限密码
     *
     * @param appPermissionSourceDTO appPermissionSourceDTO
     * @param password               password
     */
    void checkPassword(AppPermissionSourceDTO appPermissionSourceDTO, String password);
}
